package com.cool.shark.controller;

import com.cool.shark.pojo.dto.GoodsDto;
import com.cool.shark.pojo.dto.GoodsEnableDto;
import com.cool.shark.pojo.dto.GoodsStandardDto;
import com.cool.shark.pojo.vo.*;
import com.cool.shark.service.GoodsService;
import com.cool.shark.web.JsonResult;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @Name: GoodsController
 * @Author: 西风残叶
 * @Date: 2024/4/17 20:45
 * @Version: 1.0
 * @TODO: TODO
 */
@RestController
@Slf4j
@RequestMapping("/goods")
public class GoodsController {
    @Autowired
    private GoodsService service;

    @PostMapping("/insert")
    public JsonResult<Void> insert(@RequestBody GoodsDto goodsDto) {
        log.info("准备处理新增商品业务,参数为:{}", goodsDto);
        service.insert(goodsDto);
        log.info("新增商品业务处理完毕");
        return JsonResult.ok();
    }

    /**
     * 查询商品列表
     *
     * @return JsonResult<List < GoodsVo>> 返回商品列表的查询结果，其中包含商品信息的集合。
     */
    @GetMapping("/list")
    public JsonResult<List<GoodsVo>> list() {
        // 记录准备处理查询商品列表业务的日志
        log.info("准备处理查询商品列表业务");
        // 调用service层方法，查询商品列表
        List<GoodsVo> list = service.list();
        // 记录查询商品列表业务处理完毕的日志，并打印查询结果
        log.info("查询商品列表业务处理完毕,结果为:{}", list);
        // 返回查询结果
        return JsonResult.ok(list);
    }
    @GetMapping("/listAll")
    public JsonResult<List<GoodsVo>> listAll() {
        // 记录准备处理查询商品列表业务的日志
        log.info("准备处理查询商品列表业务");
        // 调用service层方法，查询商品列表
        List<GoodsVo> list = service.listAll();
        // 记录查询商品列表业务处理完毕的日志，并打印查询结果
        log.info("查询商品列表业务处理完毕,结果为:{}", list);
        // 返回查询结果
        return JsonResult.ok(list);
    }

    /**
     * 修改商品状态启用或禁用
     *
     * @param goodsEnableDto 包含商品状态和商品ID的数据传输对象
     * @return 返回操作结果，成功则返回空的JsonResult
     */
    @PostMapping("/changeEnable")
    public JsonResult<Void> changeEnable(@RequestBody GoodsEnableDto goodsEnableDto) {
        log.info("修改Banner状态，参数为：{}", goodsEnableDto);
        // 根据传入的enable值，调用相应的方法修改banner的状态
        if (goodsEnableDto.getEnable() == 1) {
            service.setEnable(goodsEnableDto.getSpuId());
        } else {
            service.setDisable(goodsEnableDto.getSpuId());
        }
        return JsonResult.ok();
    }

    /**
     * 根据商品主体ID查询商品信息。
     *
     * @param spuId 商品主体ID，用于查询特定商品的信息。
     * @return JsonResult<GoodsVo> 返回一个包含商品信息的JSON结果对象。
     */
    @GetMapping("/getGoodsBySpuId")
    public JsonResult<GoodsStandardVo> getGoodsBySpuId(Long spuId) {
        // 记录查询开始的日志，包括传入的SPU ID
        log.info("根据商品编码查询商品信息，参数为：{}", spuId);
        // 调用服务层方法，根据SPU ID查询商品信息
        GoodsStandardVo goodsVo = service.getGoodsBySpuId(spuId);
        // 记录查询结果的日志，包括查询到的商品信息
        log.info("根据商品编码查询商品信息，结果为：{}", goodsVo);
        // 返回查询结果
        return JsonResult.ok(goodsVo);
    }


    /**
     * 更新商品信息
     *
     * @param goodsDto 商品数据传输对象，包含需要更新的商品信息
     * @return JsonResult<Void> 返回操作结果，成功则返回ok，不包含具体数据
     */
    @PostMapping("/update")
    public JsonResult<Void> update(@RequestBody GoodsStandardDto goodsDto) {
        // 记录接收到更新请求的日志
        log.info("准备处理修改商品业务,参数为:{}", goodsDto);
        // 调用服务层执行更新操作
        service.update(goodsDto);
        // 记录更新操作完成的日志
        log.info("修改商品业务处理完毕");
        // 返回操作成功的结果
        return JsonResult.ok();
    }

    /**
     * 根据商品ID获取商品详细信息
     *
     * @param id 商品的唯一标识符
     * @return JsonResult<GoodsDetailVo> 包含商品详细信息的结果对象。如果查询成功，result.code为200，result.data为商品详细信息的Vo；否则，根据具体错误情况设置result.code和result.message。
     */
    @GetMapping("/selectById")
    public JsonResult<GoodsDetailVo> getGoodsById(Long id) {
        // 记录查询开始的日志，包括传入的ID
        log.info("根据商品ID查询商品信息，参数为：{}", id);
        // 调用服务层方法，根据ID查询商品信息
        GoodsDetailVo goodsVo = service.getGoodsDetail(id);
        // 记录查询结果的日志，包括查询到的商品信息
        log.info("根据商品ID查询商品信息，结果为：{}", goodsVo);
        // 返回查询结果
        return JsonResult.ok(goodsVo);
    }

    @GetMapping("/getAddGoodsNum")
    public JsonResult<List<GoodsNumVo>> getAddGoodsNum() {
        // 记录查询开始的日志
        log.info("准备处理查询新增商品数量业务");
        // 调用服务层方法，查询新增商品数量
        List<GoodsNumVo> addGoodsNum = service.getGoodsNum();
        // 记录查询结果的日志，包括查询到的新增商品数量
        log.info("查询新增商品数量业务处理完毕,结果为:{}", addGoodsNum);
        // 返回查询结果
        return JsonResult.ok(addGoodsNum);
    }

    @GetMapping("/search")
    public JsonResult<List<GoodsVo>> search(String keyword) {
        // 记录查询开始的日志，包括传入的关键词
        log.info("根据关键词查询商品信息，参数为：{}", keyword);
        // 调用服务层方法，根据关键词查询商品信息
        List<GoodsVo> goodsVo = service.search(keyword);
        // 记录查询结果的日志，包括查询到的商品信息
        log.info("根据关键词查询商品信息，结果为：{}", goodsVo);
        // 返回查询结果
        return JsonResult.ok(goodsVo);
    }

    @GetMapping("/sales")
    public JsonResult<List<GoodsSalesVO>> sales() {
        // 记录查询开始的日志
        log.info("准备处理查询商品销量业务");
        // 调用服务层方法，查询商品销量
        List<GoodsSalesVO> list = service.sales();
        // 记录
        return JsonResult.ok(list);
    }

    @GetMapping("/listByCarouselId")
    public JsonResult<List<GoodsResultVo>> listByCarouselId(Long carouselId) {
        // 记录查询开始的日志，包括传入的轮播图ID
        log.info("数据为 = " + carouselId);
        List<GoodsResultVo> list = service.listByCarouselId(carouselId);
        log.info("查询结果为 = " + list);
        return JsonResult.ok(list);
    }
    @GetMapping("/delete")
    public JsonResult<Void> delete(@Param("spuId")Long spuId) {
        log.info("准备处理删除商品业务,参数为:{}", spuId);
        service.delete(spuId);
        log.info("删除商品业务处理完毕");
        return JsonResult.ok();
    }
}
